package com.wenchao.quickstart.widget.etittext;

import android.text.InputFilter;
import android.text.Spanned;
 
 
/**
 * 限制输入小数的位数及小数点后位数
 * 开头结尾不能输入.
 * 在第一位输入+或-时，第二位不能输入.
 */
 
public class DecimalDigitsInputFilter implements InputFilter {
 
    /**
     * 限制小数位数
     */
    private final int decimalDigits;
 
 
    public DecimalDigitsInputFilter(int decimalDigits) {
        this.decimalDigits = decimalDigits;
    }
 
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        int dotPos = -1;
 
//dotpos1监视正负号是否打出
        int dotPos1 = -1;
        int len = dest.length();
 
        //从数字第一位锁定小数点的位置索引
        for (int i = 0; i < len; i++) {
            char c = dest.charAt(i);
            if(c == '+' || c == '-'){
                dotPos1=0;
            }
            if (c == '.' || c == ',') {
                dotPos = i;
                break;
            }
        }
 
 
 
        //使得数字第一个打出".",则数字第一位与最后一位索引都为0
        //即.***格式数字打不出来
        if(source.equals(".") && dstart==0&&dend==0){
            return "";
        }
 
        //使得数字第一个打出"+"或者“-”,第二位打不出“.”
        //即+.***或者-.***格式数字打不出来
        if(dotPos1==0&&source.equals(".")&&dstart==1&&dend==1){
            return "";
        }
 
 
        if (dotPos >= 0) {
            // protects against many dots
            //存在小数点，不能再次打出小数点
            if (source.equals(".") || source.equals(",")) {
                return "";
            }
            // if the text is entered before the dot
 
            //若限制小数位数为12，则dend最大为11
            //若小数已经打到12位并不包含小数点，即最后一个数字索引为11
            //若小数已经打到12位，最后是一个小数点，索引为11
            //也就是限制12位数字当全是数字，dotpos=-1,不执行if
            // 或者最后一位是小数点时候,doypos=11,dend=11,执行if
            //则不能再键任何符号数字等
            if (dend <= dotPos) {
                return null;
            }
            //限制小数位数
            //数字总长-小数点索引，如120.0654
            //len=8,dotpos=3,len-dotpos=5,decimalDigits代表小数位数
            //使其为4，则小数点个数必须小于等于4，不是，则返回空
            if (len - dotPos > decimalDigits) {
                return "";
            }
        }
        return null;
    }
}